const authsettings = require('./settings');
const SEA = require('./sea');
const Gun = SEA.Gun;
//const { scope: seaIndexedDb } = require('./indexed')
// This updates sessionStorage & IndexedDB to persist authenticated "session"
const updateStorage = (proof, key, pin) => async props => {
  if (!Gun.obj.has(props, 'alias')) {
    return; // No 'alias' - we're done.
  }
  if (authsettings.validity && proof && Gun.obj.has(props, 'iat')) {
    props.proof = proof;
    delete props.remember; // Not stored if present

    const alias = props.alias;
    const id = props.alias;
    const remember = { alias: alias, pin: pin };

    try {
      const signed = await SEA.sign(JSON.stringify(remember), key);

      sessionStorage.setItem('user', alias);
      sessionStorage.setItem('remember', signed);

      const encrypted = await SEA.encrypt(props, pin);

      if (encrypted) {
        const auth = await SEA.sign(encrypted, key);
        await seaIndexedDb.wipe(); // NO! Do not do this. It ruins other people's sessionStorage code. This is bad/wrong, commenting it out.
        await seaIndexedDb.put(id, { auth: auth });
      }

      return props;
    } catch (err) {
      throw { err: 'Session persisting failed!' };
    }
  }

  // Wiping IndexedDB completely when using random PIN
  await seaIndexedDb.wipe(); // NO! Do not do this. It ruins other people's sessionStorage code. This is bad/wrong, commenting it out.
  // And remove sessionStorage data
  sessionStorage.removeItem('user');
  sessionStorage.removeItem('remember');

  return props;
};
module.exports = updateStorage;
